Control column visibility

1import { HStack, Label, List, Navigation, NavigationSplitView, NavigationSplitViewVisibility, Script, Text, useState, VStack } from "scripting"
2
3type Department = {
4  name: string
5  staff: Person[]
6}
7
8type Company = {
9  name: string
10  departments: Department[]
11}
12
13type Person = {
14  name: string
15  phoneNumber: string
16}
17
18const companyA: Company = {
19  name: "Company A",
20  departments: [
21    {
22      name: "Sales",
23      staff: [
24        {
25          name: "Juan Chavez",
26          phoneNumber: "(408) 555-4301",
27        },
28        {
29          name: "Mei Chen",
30          phoneNumber: "(919) 555-2481",
31        }
32      ]
33    },
34    {
35      name: "Engineering",
36      staff: [
37        {
38          name: "Bill James",
39          phoneNumber: "(408) 555-4450"
40        },
41        {
42          name: "Anne Johnson",
43          phoneNumber: "(417) 555-9311"
44        }
45      ]
46    }
47  ]
48}
49
50const companies: Company[] = [
51  {
52    name: "Company A",
53    departments: [
54      {
55        name: "Sales",
56        staff: [
57          {
58            name: "Juan Chavez",
59            phoneNumber: "(408) 555-4301",
60          },
61          {
62            name: "Mei Chen",
63            phoneNumber: "(919) 555-2481",
64          }
65        ]
66      },
67      {
68        name: "Engineering",
69        staff: [
70          {
71            name: "Bill James",
72            phoneNumber: "(408) 555-4450"
73          },
74          {
75            name: "Anne Johnson",
76            phoneNumber: "(417) 555-9311"
77          }
78        ]
79      }
80    ]
81  },
82  {
83    name: "Company B",
84    departments: [
85      {
86        name: "Human resources",
87        staff: [
88          {
89            name: "Lily",
90            phoneNumber: "(111) 555-5552"
91          },
92          {
93            name: "Ross",
94            phoneNumber: "(222) 666-8888"
95          }
96        ]
97      },
98      {
99        name: "Sales",
100        staff: [
101          {
102            name: "John",
103            phoneNumber: "(1) 888-4444"
104          }
105        ]
106      }
107    ]
108  }
109]
110
111function PersonRowView({
112  person
113}: {
114  person: Person
115}) {
116  return <VStack
117    alignment={"leading"}
118    spacing={3}
119  >
120    <Text
121      foregroundStyle={"label"}
122      font={"headline"}
123    >{person.name}</Text>
124    <HStack
125      spacing={3}
126      foregroundStyle={"secondaryLabel"}
127      font={"subheadline"}
128    >
129      <Label
130        title={person.phoneNumber}
131        systemImage={"phone"}
132      />
133    </HStack>
134  </VStack>
135}
136
137function PersonDetailView({
138  person
139}: {
140  person: Person
141}) {
142
143  return <VStack>
144    <Text
145      font={"title"}
146      foregroundStyle={"label"}
147    >{person.name}</Text>
148    <HStack
149      foregroundStyle={"secondaryLabel"}
150    >
151      <Label
152        title={person.phoneNumber}
153        systemImage={"phone"}
154      />
155    </HStack>
156  </VStack>
157}
158
159 function Example() {
160  const [columnVisibility, setColumnVisibility] = useState<NavigationSplitViewVisibility>("detailOnly")
161  const [selectedPerson, setSelectedPerson] = useState<Person>()
162
163  return <NavigationSplitView
164    columnVisibility={{
165      value: columnVisibility,
166      onChanged: (value) => {
167        console.log("columnVisibility changed to", value)
168        setColumnVisibility(value)
169      },
170    }}
171    sidebar={
172      <List>
173        {companyA.departments[0].staff.map(person =>
174          <PersonRowView
175            person={person}
176            contentShape={"rect"}
177            onTapGesture={() => {
178              setSelectedPerson(person)
179            }}
180          />
181        )}
182      </List>
183    }
184  >
185    {selectedPerson != null
186      ? <PersonDetailView
187        person={selectedPerson}
188      />
189      : <Text>Please select a person.</Text>
190    }
191  </NavigationSplitView>
192}
193
194async function run() {
195  await Navigation.present({
196    element: <Example />
197  })
198
199  Script.exit()
200}
201
202run()